<html>
<head>
<script>
    function nodeAsString(node)
    {
        if (node && node.nodeType == Node.TEXT_NODE)
            return "text in " + nodeAsString(node.parentNode);
        if (node && node.nodeType == Node.ELEMENT_NODE) {
            var id;
            if (id = node.getAttribute("id"))
                return id;
        }
        return node;
    }
    function selectionAsString()
    {
        return "(" + nodeAsString(getSelection().anchorNode)
            + ", " + getSelection().anchorOffset
            + "), (" + nodeAsString(getSelection().focusNode)
            + ", " + getSelection().focusOffset + ")";        
    }
    function checkSelection(step, expected)
    {
        if (selectionAsString() !== expected) {
            document.getElementById("result").innerHTML = "FAIL: After step " + step + " selection was " + selectionAsString();
            return true;
        }
        return false;
    }
    function runTest()
    {
        if (window.testRunner)
            testRunner.dumpAsText();
        getSelection().collapse(document.getElementById("first").firstChild, 4);
        if (checkSelection(1, "(text in first, 4), (text in first, 4)"))
            return;
        getSelection().modify("extend", "backward", "line");
        if (checkSelection(2, "(text in first, 4), (text in first, 0)"))
            return;
        getSelection().collapse(document.getElementById("last").firstChild, 4);
        if (checkSelection(3, "(text in last, 4), (text in last, 4)"))
            return;
        getSelection().modify("extend", "forward", "line");
        if (checkSelection(4, "(text in last, 4), (text in last, 61)"))
            return;
        getSelection().collapse(document.getElementById("first").firstChild, 4);
        if (checkSelection(5, "(text in first, 4), (text in first, 4)"))
            return;
        getSelection().modify("extend", "backward", "paragraph");
        if (checkSelection(6, "(text in first, 4), (text in first, 0)"))
            return;
        getSelection().collapse(document.getElementById("last").firstChild, 4);
        if (checkSelection(7, "(text in last, 4), (text in last, 4)"))
            return;
        getSelection().modify("extend", "forward", "paragraph");
        if (checkSelection(8, "(text in last, 4), (text in last, 61)"))
            return;
        document.getElementById("result").innerHTML = "SUCCESS";
    }
</script>
</head>
<body onload="runTest()"><p id="first">This is the first paragraph, used for the moving-backward test.</p>
<p>This tests for a problem with selections at document edges.</p>
<p id="result">TEST HAS NOT YET RUN.</p>
<p id="last">This is the last paragraph, used for the moving-forward test.</p>
</body>
</html>
